﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HerGoS.Viaticos.Entities;
using HerGoS.DAO;
using HerGoS.Interfaces;
using System.Data;
using HerGoS.Administration.Entities;
using HerGoS.Administration.Engine;
using HerGoS.Viaticos.Exceptions;

namespace HerGoS.Viaticos.Engine
{
   public class GestorTramo
    {

       public static Tramo Obtener(int oid)
       {
           try
           {
               IRepository repo = RepositoryFactory.Create(Config.RepositoryViaticosName);
               repo.Nombre = "TRAMOS_SP";
               repo.AddParameter("@ACCION", "BYID");
               repo.AddParameter("@ID", oid);
               DataTable dt = repo.ExecuteDataTable();
               Tramo result = dt.ToGenericList<Tramo>(TramoConverter).FirstOrDefault();
               return result;
           }
           catch (Exception ex)
           {
               throw new SolicitudGetException(ex);
           }
       }


       public static void Guardar(Tramo tramo, ITramos entidad)
       {
           try
           {
               IRepository repo = RepositoryFactory.CreateTransactional(Config.RepositoryViaticosName);
               repo.Nombre = "TRAMOS_PROC";
               repo.AddParameter("@ACCION", tramo.Persistencia);
               repo.AddParameter("@ID", tramo.OID);
               repo.AddParameter("@ENTIDAD", (entidad != null) ? entidad.GetType().Name : null);
               repo.AddParameter("@IDREGISTRO", (entidad != null) ? entidad.OID : 0);
               repo.AddParameter("@ORDEN", tramo.Orden);
               repo.AddParameter("@IDTIPOTRANPORTE", (tramo.Transporte == null) ? (int?) null : tramo.Transporte.OID);
               
               repo.AddParameter("@IDCIUDADORIGEN", tramo.CiudadOrigen == null ? (int?) null : tramo.CiudadOrigen.OID);
               repo.AddParameter("@FECHAHORAORIGEN", tramo.FechaOrigen);
               repo.AddParameter("@NROSERVICIOORIGEN", tramo.NroServicioOrigen);
               repo.AddParameter("@CODIGOORIGEN", tramo.CodigoOrigen);
               repo.AddParameter("@OBSERVACIONORIGEN", tramo.ObservacionOrigen);
               repo.AddParameter("@MONTOTERMORIGENIDA", tramo.MontoTerminalOrigenIda);
            
               repo.AddParameter("@IDCIUDADDESTINO", tramo.CiudadDestino == null ? (int?)null : tramo.CiudadDestino.OID);
               repo.AddParameter("@FECHAHORADESTINO", tramo.FechaDestino);
               repo.AddParameter("@NROSERVICIODESTINO", tramo.NroServicioDestino);
               repo.AddParameter("@CODIGODESTINO", tramo.CodigoDestino);
               repo.AddParameter("@OBSERVACIONDESTINO", tramo.ObservacionDestino);
               repo.AddParameter("@MONTOTERMDESTINOIDA", tramo.MontoTerminalDestinoIda);
          

               repo.AddParameter("@ANULAGASTOTERMINALIDA", tramo.AnularMontoTerminalOrigenIda);
               repo.AddParameter("@ANULAGASTOTERMINALVUELTA", tramo.AnularMontoTerminalDestinoIda);
               repo.AddParameter("@KMECORRIDOS",tramo.kmRecorridos == 0 ? (decimal?) null : tramo.kmRecorridos);

               repo.AddParameter("@DIASVIATICOSDESTINO", tramo.DiasViaticos);
               repo.AddParameter("@traDIASVIATICOSMANUAL", tramo.DiasViaticosManual);
               repo.AddParameter("@TARIFADIARIADESTINO", tramo.TarifaDiariaDestino);
               repo.AddParameter("@PORCVIATICO", tramo.PorcentajeViatico);
               repo.AddParameter("@PORCAPLICACION", tramo.PorcentajeAplicacion);
               repo.AddParameter("@IDUSUARIO", HGSContext.Usuario.OID);
               tramo.OID = repo.ExecuteReturnValue().ToInteger();
               repo.Commit();

             //  GestorBitacora.Guardar(tramo);
           }
           catch (Exception ex)
           {
               throw new TramoSaveException(ex);
           }
       }

       public static void Guardar(List<Tramo> tramos, ITramos entidad)
       {          
            tramos.ForEach(x => Guardar(x, entidad));
       }



       /// <summary>
       /// Guarda una lista de contacto relacionada a una entidad que implementa IContactos
       /// </summary>
       /// <param name="contactos">Lista de contactos</param>
       /// <param name="entidad">Entidad</param>
       public static void Guardar(ITramos entidad)
       {
           
           foreach (Tramo c in entidad.Tramos)
           {
               Guardar(c, entidad);
           }
       }

      
       public static void Eliminar(Tramo tramo)
       {
           tramo.Persistencia = EstadoPersistencia.DELETE;
           Guardar(tramo, null);
       }

       
       public static List<Tramo> Consultar(ITramos entidad)
       {
           try
           {
               IRepository repo = RepositoryFactory.Create(Config.RepositoryViaticosName);
               repo.Nombre = "TRAMOS_SP";
               repo.AddParameter("@ACCION", "CONSULTA");
               repo.AddParameter("@ID", null);
               repo.AddParameter("@ENTIDAD", entidad.GetType().Name);
               repo.AddParameter("@IDREGISTRO", entidad.OID);
               DataTable dt = repo.ExecuteDataTable();
               List<Tramo> result = dt.ToGenericList<Tramo>(TramoConverter);
               return result;
           }
           catch (Exception ex)
           {
               throw new TramoGetException(ex);
           }
       }


       public static List<Tramo> Activos(ITramos entidad)
       {
           try
           {
               return entidad.Tramos.Where(x => x.Persistencia != EstadoPersistencia.DELETE).ToList();
           }
           catch (Exception ex)
           {
               throw new TramoGetException(ex);
           }
       }
          


       #region Converter
       public static Tramo TramoConverter(DataRow row)
       {
           return new Tramo
           {
               OID = row["traID"].ToInteger(),
               CiudadOrigen = GestorCiudad.Obtener(row["traIDCIUDADORIGEN"].ToInteger()),
               NroServicioOrigen = row["traNROSERVICIOORIGEN"].ToString(),
               CodigoOrigen = row["traCODIGOORIGEN"].ToString(),
               FechaOrigen = row["traFECHAHORAORIGEN"].ToDateTime(),
               
               MontoTerminalOrigenIda = row["traMONTOTERMORIGENIDA"].ToDecimal(),
               MontoTerminalDestinoIda = row["traMONTOTERMDESTINOIDA"].ToDecimal(),
               AnularMontoTerminalOrigenIda = row["traANULAGASTOTERMINALIDA"].ToBoolean(),
               AnularMontoTerminalDestinoIda = row["traANULAGASTOTERMINALVUELTA"].ToBoolean(),

               ObservacionOrigen = row["traOBSERVACIONORIGEN"].ToString(),
               CiudadDestino = GestorCiudad.Obtener(row["traIDCIUDADDESTINO"].ToInteger()),
               NroServicioDestino = row["traNROSERVICIODESTINO"].ToString(),
               CodigoDestino = row["traCODIGODESTINO"].ToString(),
               FechaDestino = row["traFECHAHORADESTINO"].ToDateTime(),
               
               ObservacionDestino = row["traOBSERVACIONDESTINO"].ToString(),
               Transporte =  GestorTransporte.Obtener(row["traIDTIPOTRANPORTE"].ToInteger()),
               TarifaDiariaDestino = row["traTARIFADIARIADESTINO"].ToDecimal(),
               DiasViaticos = row["traDIASVIATICOSDESTINO"].ToDecimal(),
               PorcentajeViatico = row["traPORCVIATICO"].ToDecimal(),
               PorcentajeAplicacion = row["traPORCAPLICACION"].ToDecimal(),
               kmRecorridos = row["traKMRECORRIDOS"].ToDecimal(),
               DiasViaticosManual = row["traDIASVIATICOSMANUAL"].ToBoolean(),
                                                 
               Persistencia = EstadoPersistencia.UPDATE
           };
       }
       #endregion



    }
}
